package org.opens.freemarker;

import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.resource.ClassPathResource;
import freemarker.template.Configuration;
import freemarker.template.Template;

import java.io.File;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.StringJoiner;

public class FreemarkerUtil {

    private static String ftlPath = null;

    private static Configuration config = null;

    static {
        ClassPathResource classPathResource = new ClassPathResource("ftl");
        ftlPath = classPathResource.getAbsolutePath();

        // 创建配置类
        config = new Configuration(Configuration.getVersion());
    }

    /**
     * 调用freemarker编译文件
     * @param descPath 输出文件路径, freemarker会自动创建输出文件
     * @param modalMap 数据
     * @param ftlFileName 模板位置
     */
    public static void compileProcess(String descPath, Map<String, Object> modalMap, String ftlFileName) {
        compileProcess(ftlPath, descPath, modalMap, ftlFileName);
    }

    /**
     * 调用freemarker编译文件
     * @param ftlPath       自定义ftl路径, 方便外部调用
     * @param descPath      输出文件路径, freemarker会自动创建输出文件
     * @param modalMap      数据
     * @param ftlFileName   模板位置
     */
    public static void compileProcess(String ftlPath, String descPath, Map<String, Object> modalMap, String ftlFileName) {
        File ftlPathFile = new File(ftlPath);
        if (!ftlPathFile.exists()) {
            throw new RuntimeException("指定的ftl路径不存在!");
        }
        if (!ftlPathFile.isDirectory()) {
            throw new RuntimeException("指定的ftl路径不是文件夹!");
        }

        FileWriter writer = null;

        try {
            // 指定模板位置
            config.setDirectoryForTemplateLoading(ftlPathFile);
            // 设置编码
            config.setDefaultEncoding("utf-8");
            // 指定模板位置下的某个模板
            Template template = config.getTemplate(ftlFileName);

            // 获取文件输入流, 最终freemarker会将编译完的文件以输出流的方式输出
            writer = new FileWriter(descPath);
            // 其实这个就是编译的过程
            template.process(modalMap, writer);
        } catch (Exception e) {
            //
        } finally {
            // 关闭输出流
            IoUtil.close(writer);
        }
    }

    /**
     * 直接编译文件输出到相对目录下
     * @param ftlFilePathStr    ftl路径
     * @param modalMap          数据
     */
    public static void compileProcess(String ftlFilePathStr, Map<String, Object> modalMap) {
        File ftlFile = new File(ftlFilePathStr);
        if (!ftlFile.exists()) {
            throw new RuntimeException("指定的ftl文件不存在!");
        }
        if (!ftlFile.isFile()) {
            throw new RuntimeException("指定的ftl文件不是文件类型!");
        }

        final String outputDirName = "out";

        String parentPathStr = ftlFile.getParent();
        String ftlName = ftlFile.getName();
        String descPathStr = new StringJoiner(File.separator).add(parentPathStr).add(outputDirName).add(ftlFile.getName()).toString();

        File outputDirFile = new File(parentPathStr, outputDirName);
        if (!outputDirFile.exists()) {
            if (!outputDirFile.mkdirs()) {
                throw new RuntimeException("创建输出目录(" + outputDirFile.getAbsolutePath() + ")失败!");
            }
        }

        compileProcess(parentPathStr, descPathStr, modalMap, ftlName);
    }

    public static void main(String[] args) {
        String path = "C:\\Users\\zhangyuming\\Desktop\\temp1111\\a.ftl";
        Map<String, Object> map = new HashMap<>();
        map.put("user", "1");
        map.put("name", "s1");
        compileProcess(path, map);
    }

}
